package org.afei.ioc.container;


import org.afei.ioc.data.DataContext;
import org.afei.ioc.entity.BeanEntity;
import org.afei.ioc.exception.BeansException;

/**
 * @author afei
 * @date 17-5-25.
 */
public interface Container {

    /**
     * 获取容器的某个服务提供者实例
     *
     * @param name
     * @return
     */
    Object getBean(String name);

    <T> T getBean(String name, Class<T> clazz);


    /**
     * <ur>
     * <li>根据服务提供者名称，服务名称，参数来获取容器提供的服务</li>
     * <li>由三者确定一个唯一的服务。</li>
     * </ur>
     *
     * @param beanName
     * @param serviceName
     * @param args
     * @return
     */
    Object getService(String beanName, String serviceName, Object... args)
            throws BeansException;

    /**
     * 获取容器所有服务描述信息
     *
     * @return
     */
    DataContext getBeanDefinitionContext();

    /**
     * 获取容器中某个服务提供者的描述信息
     *
     * @param name
     * @return
     */
    BeanEntity getBeanDefinition(String name);

    /**
     * 获取容器中所有服务提供者实例的缓存
     *
     * @return
     */
    DataContext getBeanCacheContext();

    /**
     * 热加载新的服务提供者
     *
     * @param resource
     */
    void initContainerService(String resource);

}
